package com.harvey.exampreparation.adapter;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.harvey.exampreparation.R;
import com.harvey.exampreparation.entity.Contact;

import java.util.List;

public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ViewHolder> {

    // 1. 首先创建 ViewHolder 类,并继承 RecyclerView.ViewHolder 类
    //    并在该类中声明 item_contact.xml 布局中需要绑定的控件对象
    //    并且实现该类的构造方法, 利用构造方法中的 itemView 对象使用
    //    findViewById() 完成控件绑定操作.
    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView tvContactName;
        public TextView tvContactPhone;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tvContactName = itemView.findViewById(R.id.tv_contact_name);
            tvContactPhone = itemView.findViewById(R.id.tv_contact_phone);
        }
    }

    // 2. 声明这个 Adapter 需要用到的集合对象, 一般是 List, 并提供相应设值的方法
    private List<Contact> contacts;

    public ContactAdapter(List<Contact> contacts) {
        this.contacts = contacts;
    }

    public void setContacts(List<Contact> contacts) {
        this.contacts = contacts;
        // 赋值完之后, 还需要调用下面这个 notifyDataSetChanged 方法, 否则视图不会有变更
        notifyDataSetChanged();
    }

    // 3. 实现 RecyclerView.Adapter 父类的 3 个抽象方法

    // 3.1. 该方法主要需要把 ViewHolder 创建出来, 并返回出去
    //      主要通过 LayoutInflater 将 xml 的布局变成一个 View 对象, 再通过这个 View 对象实例化本类的 ViewHolder 即可
    //      ps:基本都是一些模板代码, 照着写就行
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_contact, parent, false));
    }

    // 3.2. 该方法比较关键, 主要决定列表视图中, 每一项的内容
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        // 从传入的 List 中获取元素, 该方法中的 position 参数即为当前项所在的位置
        Contact contact = contacts.get(position);
        // 将 Contact 对象的信息设置在 TextView 控件上
        holder.tvContactName.setText(contact.getName());
        holder.tvContactPhone.setText(contact.getPhone());
    }

    // 3.1. 该方法需要返回一共需要渲染多少项内容, 直接通过调用 List 的 size 方法即可
    @Override
    public int getItemCount() {
        return contacts.size();
    }

}
